package com.softeem.idriveserver.controller;

import cn.hutool.core.util.RandomUtil;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.softeem.idriveserver.dto.Result;
import com.softeem.idriveserver.entity.User;
import com.softeem.idriveserver.service.UserService;
import com.softeem.idriveserver.utils.ObjectUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.awt.*;
import java.util.List;
import java.util.Objects;

@Tag(name = "用户管理")
@RestController
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 用户列表查询
     *
     * @return
     */
    @Operation(summary = "用户列表",description = "分页查询用户信息")
    @Parameters({
            @Parameter(name = "page",description = "页码",required = true),
            @Parameter(name = "limit",description = "每页记录数",required = true)
    })
    @GetMapping("/user/list")
    public Result list(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "2") Integer limit) {
        //执行分页查询
        List<User> users = userService.list(new Page<User>(page, limit));
        return Result.ok().setData(users).setMsg("成功");
    }

    /**
     * 登录验证
     * @param phone
     * @param password
     * @return
     */
    @Operation(summary = "用户登录",description = "账号密码登录")
    @Parameters({
            @Parameter(name = "username",description = "用户名",required = true),
            @Parameter(name = "password",description = "密码",required = true)
    })
    @GetMapping("/user/login")
    public Result login(String phone, String password) {
        //1.查询账户是否存在
        User user = userService.getOne(Wrappers.lambdaQuery(User.class).eq(User::getPhone, phone));
        if (user == null) {
            return Result.error().setMsg("用户不存在");
        }
        //获取数据库中用户token
        String token = user.getToken();
        //对密码加盐加密
        password = SecureUtil.md5(password + token);
        if (!Objects.equals(password, user.getPassword())) {
            return Result.error().setMsg("密码错误");
        }
        if (user.getStatus() != 1) {
            return Result.error().setMsg("账号禁用");
        }
        //对密码和token脱敏
        user.setPassword("******");
        user.setToken("******");
        return Result.ok().setMsg("登录成功").setData(user);
    }

    /**
     * 注册账号
     * @param phone
     * @param password
     * @return
     */
    @Operation(summary = "用户注册",description = "账号密码注册")
    @Parameters({
            @Parameter(name = "username",description = "用户名",required = true),
            @Parameter(name = "password",description = "密码",required = true)
    })
    @PostMapping("/user")
    public Result registry(String phone, String password) {
        //检查账号（手机号）是否重复
        User user = userService.getOne(Wrappers.lambdaQuery(User.class).eq(User::getPhone, phone));
        if (user != null) {
            return Result.error().setMsg("手机号已存在");
        }
        //对密码加盐加密
        //生成随机字符串作为token(盐)
        String token = RandomUtil.randomString(16);
        //将输入的密码和盐组合加密（md5）
        password = SecureUtil.md5(password + token);

        user = new User();
        user.setPhone(phone);
        //将加密后的密码存入数据库
        user.setPassword(password);
        //记录token
        user.setToken(token);
        boolean b = userService.save(user);
        return b ? Result.ok().setMsg("注册成功").setData(user) : Result.error().setMsg("注册失败");
    }

    /**
     * 修改用户信息
     * @param user
     * @return
     */
    @Operation(summary = "用户修改",description = "根据ID修改用户信息")
    @PutMapping("/user")
    public Result modify(@RequestBody User user) {
        if (user.getId() == null) {
            return Result.error().setMsg("未提供用户ID无法查询");
        }
        //根据ID查询
        User oldUser = userService.getById(user.getId());
        if (oldUser == null) {
            return Result.error().setMsg("用户不存在");
        }
        //若涉及到密码的更新，则需要重新生成token,以及加密
        if (user.getPassword() != null) {
            //检查新密码是否和老密码一致？若一致则不做修改
            if (!oldUser.getPassword().equals(SecureUtil.md5(user.getPassword() + oldUser.getToken()))) {
                //重新生成token
                String token = RandomUtil.randomString(16);
                //重新加密
                String password = SecureUtil.md5(user.getPassword() + token);
                user.setPassword(password);
                user.setToken(token);
            } else {
                //不做修改
                user.setPassword(null);
            }
        }
        //判定是否不需要做任何修改（对象中除了id没有其他任何需要修改字段）
        if (ObjectUtils.checkObjectIsNullExpId(user)) {
            return Result.error().setMsg("未提供需要修改的字段");
        }

        //执行更新
        boolean b = userService.updateById(user);
        //返回结果
        return b ? Result.ok().setMsg("修改成功") : Result.error().setMsg("修改失败");
    }

    /**
     * 通过GET请求方式查询用户信息
     *
     * @param id 用户ID
     * @return 查询结果，包括用户信息（如果存在）
     */
    @Operation(summary = "用户查询",description = "根据ID查询用户信息")
    @Parameters({
            @Parameter(name = "id",description = "用户ID",required = true)
    })
    @GetMapping("/user/query")
    public Result getById(Integer id) {
        // 根据ID调用userService的getById方法获取用户信息
        User user = userService.getById(id);

        // 检查获取的用户信息是否为null
        if (Objects.isNull(user)) {
            // 如果用户不存在，返回错误结果，并设置提示信息"用户不存在"
            return Result.error().setMsg("用户不存在");
        }

        // 如果用户存在，返回成功结果，并设置提示信息"查询成功"，同时携带用户信息
        return Result.ok().setMsg("查询成功").setData(user);
    }

    /**
     * 根据手机号模糊查询用户列表，要求实现分页查询
     */
    @Operation(summary = "用户列表",description = "分页查询用户信息")
    @Parameters({
            @Parameter(name = "page",description = "页码",required = true),
            @Parameter(name = "limit",description = "每页记录数",required = true)
    })
    @GetMapping("/user/queryByPhone")
    public Result queryByPhone(@RequestParam(defaultValue = "1") Integer page,
                               @RequestParam(defaultValue = "2") Integer limit,
                               String phone) {
        //执行分页查询
        List<User> users = userService.list(new Page<User>(page, limit),
                Wrappers.lambdaQuery(User.class).like(User::getPhone, phone));
        return Result.ok().setData(users).setMsg("成功");
    }

}
